﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using MvcCoreWeb.Entities_业务实体模型;
using MvcCoreWeb.EntitiesProcess_对象访问服务;
using MvcCoreWeb.Models;

namespace lsj
{
    public class PersonController : Controller
    {
        private readonly IpersonRepository _PersonService;   // 人员数据处理服务
        public PersonController(IpersonRepository service)
        {
            _PersonService = service;
        }
        /// <summary>
        /// 数据列表，控制器缺省路由入口方法：
        /// 负责根据传入的关键词，从存储中找出满足条件的对象，转成视图模型集合，与前端的视图 Index 中的
        /// 模型 @model IEnumerable<PersonViewModel> 绑定。
        /// </summary>
        /// <param name="keyword">关键词</param>
        /// <returns>列表视图实例</returns>
    
        public ActionResult Index(string keyword = null)
        {
            var persons = new List<Person>();
            if (String.IsNullOrEmpty(keyword))
                persons = _PersonService.GetPersons();
            else
                persons = _PersonService.GetPersons(keyword);

            var personVMCollection = new List<PersonViewModel>();
            var counter = 0;
            foreach (var item in persons)
            {
                var personVM = new PersonViewModel(item);
                personVM.OrderNumber = (++counter).ToString();
                personVMCollection.Add(personVM);
            }

            ViewData["Title"] = "员工数据维护管理";
            ViewData["Keyword"] = keyword;

            return View(personVMCollection);
        }
        /// <summary>
        /// 新建数据：
        /// 负责为新建数据请求创建一个新的数据对象，转换为相应的视图模型，与前端视图 Create 视图实例的
        /// 模型 PersonViewModel 绑定
        /// </summary>
        /// <returns>新建数据视图实例</returns>
        [HttpGet]
        public ActionResult Create()
        {
            var person = new Person();
            var personVM = new PersonViewModel(person);
            ViewData["Title"] = "新建员工数据";
            return View(personVM);
        }
        /// <summary>
        /// 保存新建数据：
        /// 负责对使用表单（Form）所提交的视图模型对象数据进行校验，校验合规的数据进行持久化处理（添加），校验不合规的视图数据返回到
        /// 请求视图中重新处理，返回的视图模型中带上校验错误信息。
        /// </summary>
        /// <param name="personVM">通过显式绑定表单元素的方式构建的视图模型</param>
        /// <returns>校验通过执行添加返回数据列表视图实例，否则返回新建视图实例</returns>
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind("ID,Name,Email,Mobile,Description, SortCode")]PersonViewModel personVM)
        {
            if (ModelState.IsValid)
            {
                _PersonService.Add(personVM.ToPerson());
                return RedirectToAction(nameof(Index));
            }

            ViewData["Title"] = "新建员工数据";
            return View(personVM);
        }
        /// <summary>
        /// 编辑数据：
        /// 负责根据访问请求的参数 id ，从存储中获取指定对象的明细数据，转换为相应的视图模型明细数据，与前端视图 Edit 的
        /// 模型 PersonViewModel 绑定，以便进行编辑。
        /// </summary>
        /// <param name="id">待处理对象的 ID</param>
        /// <returns>编辑视图实例</returns>
        public ActionResult Edit(Guid id)
        {
            var personVM = new PersonViewModel(_PersonService.GetPerson(id));
            ViewData["Title"] = "编辑员工数据";

            return View(personVM);
        }

        //添加httpPost请求响应的Edit行为
        /// <summary>
        /// 保存编辑数据：
        /// 负责对使用表单（Form）所提交的视图模型对象数据进行校验，校验合规的数据进行持久化处理（更新），校验不合规的视图数据返回到
        /// 请求视图中重新处理，返回的视图模型中带上校验错误信息。
        /// </summary>
        /// <param name="personVM">通过显式绑定表单元素的方式构建的视图模型</param>
        /// <returns>校验通过执行更新返回数据列表视图实例，否则返回编辑视图实例</returns>
        [HttpPost]
                [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind("ID,Name,Email,Mobile,Description, SortCode")]PersonViewModel personVM)
        {
            if (ModelState.IsValid)
            {

                _PersonService.Update(personVM.ToPerson());
                return RedirectToAction(nameof(Index));
            }

            ViewData["Title"] = "编辑员工数据";
            return View(personVM);
        }

        /// <summary>
        /// 删除数据：
        /// 负责根据访问请求的参数 id ，从存储中删除指定对象。
        /// </summary>
        /// <param name="id">待处理对象的 ID</param>
        /// <returns>删除成功返回数据列表视图 Index，否则返回删除确认视图 Delete</returns>
        public ActionResult Delete(Guid id)
        {
            try
            {
                _PersonService.Delete(id);
                return RedirectToAction(nameof(Index));
            }
            catch
            {
                var personVM = new PersonViewModel(_PersonService.GetPerson(id));
                ViewData["Title"] = "删除员工数据";
                return View("Delete", personVM);
            }
        }

        //添加判断是否删除方法delete行为
        /// <summary>
        /// 确定删除数据：
        /// 负责根据访问请求的参数 id ，从存储中获取指定对象的明细数据，转换为相应的视图模型明细数据，与前端视图 Delete 的模型 PersonViewModel 绑定，以便进行提醒用户，是否确定删除对象。
        /// </summary>
        /// <param name="id">待处理对象的 ID</param>
        /// <returns></returns>
        public ActionResult IsDelete(Guid id)
        {
            var personVM = new PersonViewModel(_PersonService.GetPerson(id));
            ViewData["Title"] = "删除员工数据";
            return View("Delete", personVM);
        }



        // GET: Person
        //public ActionResult Index()
        //{
        //    return View();
        //}

        // GET: Person/Details/5
        //public ActionResult Details(int id)
        //{
        //    return View();
        //}

        // GET: Person/Create
        //public ActionResult Create()
        //{
        //    return View();
        //}

        // POST: Person/Create
        //[HttpPost]
        //[ValidateAntiForgeryToken]
        //public ActionResult Create(IFormCollection collection)
        //{
        //    try
        //    {
        //        // TODO: Add insert logic here

        //        return RedirectToAction(nameof(Index));
        //    }
        //    catch
        //    {
        //        return View();
        //    }
        //}

        // GET: Person/Edit/5
        //public ActionResult Edit(int id)
        //{
        //    return View();
        //}

        //// POST: Person/Edit/5
        //[HttpPost]
        //[ValidateAntiForgeryToken]
        //public ActionResult Edit(int id, IFormCollection collection)
        //{
        //    try
        //    {
        //        // TODO: Add update logic here

        //        return RedirectToAction(nameof(Index));
        //    }
        //    catch
        //    {
        //        return View();
        //    }
        //}

        //// GET: Person/Delete/5
        //public ActionResult Delete(int id)
        //{
        //    return View();
        //}

        //// POST: Person/Delete/5
        //[HttpPost]
        //[ValidateAntiForgeryToken]
        //public ActionResult Delete(int id, IFormCollection collection)
        //{
        //    try
        //    {
        //        // TODO: Add delete logic here

        //        return RedirectToAction(nameof(Index));
        //    }
        //    catch
        //    {
        //        return View();
        //    }
        //}
    }
}